#ifndef IGSLIB_IRTC_TIMER_H
#define IGSLIB_IRTC_TIMER_H
#include <ctime>
#include "igslib_common_use.h"

namespace igslib
{
    struct IRTCTimerEvent;
	struct IRTCTimer:public IComponent
	{
        /*!
         * 取得目前時間。
         * @return 目前時間，若所有欄位都傳回0表示發生錯誤。
         */
        virtual struct tm GetTime()=0;
        /*!
         * 設定目前時間。
         * @param a0 目前時間。
         * @return 操作結果。
         *     0: 操作正常。
         *     -1: 裝置操作錯誤。
         */
		virtual int SetTime(struct tm)=0;
        /*!
         * 與第三方裝置同步，以取得真正的時間資訊。
         * @note
         * 這通常是因為我們只能與RTC的代理者(通常是MCU)溝通，所以無法取得真正RTC的時間。
         * 所以籍由StartSync()介面，我們就可以要求代理者真正同步。
         */
		virtual void Sync()=0;
        /*!
         * 更新RTC狀態。
         */
		virtual void Update()=0;
        /*!
         * 若是一個會發生錯誤狀態的RTC，可用此操作來清除錯誤狀態。
         */
        virtual void ClearError()=0;
        /*!
         * 設定事件處理者。
         * @param a0 事件處理者。
         */
        virtual void SetEventHandler(IRTCTimerEvent*)=0;
	};
    struct IRTCTimerEvent
    {
        /*!
         * 當存取時鐘發生錯誤時觸發。
         */
        virtual void OnRaiseError()=0;
    };

    struct IRTCTimerManager:public IManager<IRTCTimer*>
    {
        /*!
         * 創建一個M01平台的即時計時器。
         * @return 創建出來的即時計時器。
         *     nullptr：創建失敗。
         *     other：實作指標。
         */
        virtual IRTCTimer* NewM01RTCTimer()=0;
    };
};

extern "C"
{
    igslib::IRTCTimerManager* GetRTCTimerManagerInstance();
};

#endif
